const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const https = require('http');
const AdmZip = require('adm-zip');

// 配置项
const HANLP_VERSION = '1.8.6';
const DATA_URL = 'http://download.hanlp.com/data-for-1.7.5.zip';
const PROJECT_ROOT = process.cwd();
const DATA_ZIP_PATH = path.join(PROJECT_ROOT, 'data.zip');
const DATA_UNZIP_PATH = path.join(PROJECT_ROOT, 'data');
const LIB_DIR = path.join(PROJECT_ROOT, 'lib');
const PROPERTIES_PATH = path.join(PROJECT_ROOT, 'src/main/resources/hanlp.properties');

// 检测是否已经存在解压好的数据目录
function isDataExists() {
    // 检查 data 目录是否存在且包含必要的文件
    if (!fs.existsSync(DATA_UNZIP_PATH)) {
        return false;
    }
    
    // 检查 data 目录下是否有实际内容（可以根据实际情况调整检查逻辑）
    const files = fs.readdirSync(DATA_UNZIP_PATH);
    return files && files.length > 0;
}

// 1️⃣ 下载 HanLP 的 data.zip
function downloadData() {
    return new Promise((resolve, reject) => {
        console.log(`📥 正在下载 HanLP 数据包... ${DATA_URL}`);
        const file = fs.createWriteStream(DATA_ZIP_PATH);

        https.get(DATA_URL, (response) => {
            response.pipe(file);
            file.on('finish', () => {
                file.close(resolve);
            });
        }).on('error', (err) => {
            reject(err);
        });
    });
}

// 2️⃣ 解压 data.zip 到 ./data 目录
function unzipData() {
    console.log(`📦 正在解压 data.zip 到 ${DATA_UNZIP_PATH}...`);
    if (fs.existsSync(DATA_UNZIP_PATH)) {
        fs.rmSync(DATA_UNZIP_PATH, { recursive: true });
    }
    const zip = new AdmZip(DATA_ZIP_PATH);
    zip.extractAllTo(DATA_UNZIP_PATH, true);
    fs.unlinkSync(DATA_ZIP_PATH); // 删除 zip 文件
    console.log('✅ 解压完成');
}

// 3️⃣ 修改 hanlp.properties 中的 root= 路径
function updateHanlpProperties() {
    console.log(`⚙️ 正在更新 hanlp.properties 中的 root 路径`);

    let content = fs.readFileSync(PROPERTIES_PATH, 'utf-8');
    content = content.replace(/^root=.*$/m, `root=${DATA_UNZIP_PATH.replace(/\\/g, '/')}`);

    fs.writeFileSync(PROPERTIES_PATH, content);
    console.log(`✅ hanlp.properties 已更新`);
}

// 4️⃣ 执行 mvn install:install-file 命令安装 HanLP jar
function runMvnInstall() {
    console.log(`📦 开始执行 mvn install ...`);

    try {
        execSync(`cd "${LIB_DIR}" && mvn install:install-file -Dfile=hanlp-${HANLP_VERSION}.jar -DgroupId=com.hankcs -DartifactId=hanlp -Dversion=${HANLP_VERSION} -Dpackaging=jar`, { stdio: 'inherit' });

        execSync(`cd "${LIB_DIR}" && mvn install:install-file -Dfile=hanlp-${HANLP_VERSION}-sources.jar -DgroupId=com.hankcs -DartifactId=hanlp -Dversion=${HANLP_VERSION} -Dclassifier=sources -Dpackaging=jar`, { stdio: 'inherit' });

        console.log('✅ HanLP jar 包已成功安装到本地 Maven');
    } catch (e) {
        console.error('❌ 执行 mvn install 失败:', e.message);
        process.exit(1);
    }
}

// 🚀 主函数
async function main() {
    try {
        // 检查是否已经存在解压好的数据
        if (isDataExists()) {
            console.log('✅ 检测到已存在的 HanLP 数据，跳过下载和解压步骤');
        } else {
            console.log('🔍 未检测到 HanLP 数据，开始下载和解压...');
            // 1. 下载 data.zip
            await downloadData();

            // 2. 解压 data.zip
            await unzipData();
        }

        // 3. 更新 hanlp.properties
        updateHanlpProperties();

        // 4. 执行 mvn install
        runMvnInstall();

        console.log('🎉 HanLP 初始化已完成！');
    } catch (e) {
        console.error('❌ 初始化失败:', e.message);
        process.exit(1);
    }
}

main();